package com.cskaoyan.transaction;

import com.cskaoyan.transaction.util.JdbcUtil;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @ClassName com.cskaoyan.transaction.util.Transaction_1
 * @Description: TODO
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2023/2/7 16:03
 * @Version V1.0
 **/
public class Transaction_1 {

    public static void main(String[] args) {
        //需要在java语言中去编写一个转账案例
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        try {
            connection = JdbcUtil.getConnection();
            //获取向数据库发送sql的prepareStatement对象
            //这行代码其实就是对于start transaction的封装
            //在java环境中，我们执行的是这行代码，这行代码发送到数据库之后，执行的指令就是start transaction
            connection.setAutoCommit(false);
            preparedStatement = connection.prepareStatement("update account set money = money - ? where id = ?");
            //解释一下：转账需要指令两条sql语句，所以我们需要编写两段这样的代码，但是参数并不是完全一致
            //表示的是id=1的转出100元
            preparedStatement.setDouble(1, 100.0);
            preparedStatement.setInt(2, 1);
            //表示的是执行update操作
            preparedStatement.executeUpdate();

            int i = 1 / 0;
            //表示的是id=2的转入100元
            preparedStatement.setDouble(1, -100.0);
            preparedStatement.setInt(2, 2);
            preparedStatement.executeUpdate();
            //提交事务
            connection.commit();
        } catch (Exception e) {
            e.printStackTrace();
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        } finally {
            try {
                JdbcUtil.release(connection, preparedStatement, null);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //后续使用时，尽量都选择prepareStatement

    }
}
